﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using RightControl.Common;
using System.Web;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using Platform.Amazon.Model;
using System.IO;
using RightControl.Common;
using RightControl.Model;
using RightControl.IService;

namespace Platform.Amazon
{
    public class MWS
    {
        public const string HEAD = "";

        public const string END = "</AmazonEnvelope>";

        private static MWS _instance;

        private string _dir;

        private IPEndPoint _proxy;

        private int _aid;

        private string _accname;

        private string _shop;

        private string _mask;

        private bool _encrypt;

        private string _tail;

        private string _merchant;

        private string _access;

        private string _secret;

        private string _auth;

        private Market _am;

        private StringBuilder _xml;

        public string NextToken;

        private int _id;

        public Feed PType;

        //private Http _http;

        public static MWS Instance {
            get {
                if (_instance == null) {
                    //    Record record = new Record();
                    //    record.Columns.Add("abbr").Set("US");
                    //    record.Columns.Add("merchant").Set("A3DGRF82ZH0AWY");
                    //    record.Columns.Add("auth").Set("amzn.mws.02b58deb-39aa-2580-874e-7ebce7a54548");
                    //    record.Columns.AddInt("id").Set(17);
                    //    record.Columns.Add("name").Set("于培恒");
                    //    record.Columns.Add("shop").Set("HENG STORE");
                    //    _instance = new MWS(record);
                    //}
                }
                return _instance;
            }
        }

        //public bool 香港 {
        //    get {
        //        return _proxy != null;
        //    }
        //    set {
        //        if (!value) {
        //            _proxy = null;
        //        }
        //        else if (_proxy == null) {
        //            _proxy = new IPEndPoint(Global.香港, 8888);
        //            Http http = Http.Create();
        //            http.Authorize(_proxy);
        //        }
        //    }
        //}

        public int AccID {
            get {
                return _aid;
            }
        }

        public string AccName {
            get {
                return _accname;
            }
        }

        public string Shop {
            get {
                return _shop;
            }
        }

        public Market Market {
            get {
                return _am;
            }
        }

        public string Area {
            get {
                return _am.Area;
            }
        }

        public string Cur {
            get {
                return _am.Cur;
            }
        }

        public string Lang {
            get {
                return _am.Lang;
            }
        }

        public string UrlPrefix {
            get {
                return _am.Url;
            }
        }

        public string XML { get; set; }

        public int MessageID {
            get {
                return ++_id;
            }
        }

        public int Count {
            get {
                return _id;
            }
        }

        

        public static string 开发者ID(string abbr) {
            return "";
        }

        private void SetAppSecret() {
            
        }

        public static string Gen(string Merchant) {
            SortedList<char, bool> sortedList = new SortedList<char, bool>();
            string text = Merchant.Trim().ToUpper();
            string text2 = text;
            foreach (char c in text2) {
                if (c >= 'A' && c <= 'Z') {
                    sortedList[c] = true;
                }
            }
            List<char> list = new List<char>(sortedList.Keys);
            if (list.Count < 10) {
                for (int num = 10 - list.Count; num > 0; num--) {
                    for (char c2 = 'A'; c2 <= 'Z'; c2 = (char)(c2 + 1)) {
                        if (!sortedList.ContainsKey(c2)) {
                            sortedList.Add(c2, true);
                            list.Add(c2);
                            break;
                        }
                    }
                }
            }
            return new string(list.ToArray(), 0, 10);
        }

        public MWS(string merchant, string auth, string abbr,Feed feed) {
            _dir = "/";
            PType = feed;
            string text = abbr;
            _am = Market.Get(text);
            if (_am == null) {
                throw new Exception("没有找到亚马逊的 " + text + " 国家市场！");
            }
            _merchant = merchant;
            _auth = auth;
            if (_auth.Length == 0) {
                throw new Exception("没有亚马逊的授权令牌！");
            }
            if (_merchant.Length == 0) {
                throw new Exception("没有设置亚马逊卖家编号！");
            }
            SetAppSecret();
            if (_access.Length == 0) {
                throw new Exception("没有设置亚马逊访问编码！");
            }
            if (_secret.Length == 0) {
                throw new Exception("没有设置亚马逊密钥！");
            }
            _mask = Gen(_merchant);
            //_tail = (re.GetBool("tail") ? text.ToUpper() : "");
            //_shop = Regex.Replace(re.Get("shop"), "\\s+", " ");
            //_aid = re.GetInt("id");
            //_accname = re.Get("name") + "（" + _am.Country + "）";
        }

        public string Masking(int saleid) {
            string text = saleid.ToString();
            if (_encrypt) {
                StringBuilder stringBuilder = new StringBuilder();
                string text2 = text;
                foreach (char c in text2) {
                    if (char.IsDigit(c)) {
                        stringBuilder.Append(_mask[c - 48]);
                    }
                }
                text = stringBuilder.ToString();
            }
            if (!string.IsNullOrEmpty(_tail)) {
                text += _tail;
            }
            return text.ToUpper();
        }

        public void Append(string s) {
            _xml.Append(s);
        }

        private SortedList<string, string> Prepare() {
            SortedList<string, string> sortedList = new SortedList<string, string>(StringComparer.Ordinal);
            if (!string.IsNullOrEmpty(_auth)) {
                sortedList["MWSAuthToken"] = _auth;
            }
            sortedList["AWSAccessKeyId"] = _access;
            sortedList["SignatureVersion"] = "2";
            sortedList["SignatureMethod"] = "HmacSHA256";
            sortedList["Timestamp"] = DateTime.UtcNow.ToString(DateFormatEnum.亚马逊);
            return sortedList;
        }

        private string PostToAmazon(SortedList<string, string> query, string xml = "") {
       
            return "";
        }

        private String CalculateStringToSignV2(string parameters, string url) {
            StringBuilder data = new StringBuilder();
            data.Append("POST");
            data.Append("\n");
            Uri endpoint = new Uri(url.ToLower());
            data.Append(endpoint.Host);
            if (endpoint.Port != 443 && endpoint.Port != 80) {
                data.Append(":")
                    .Append(endpoint.Port);
            }
            data.Append("\n");
            String uri = endpoint.AbsolutePath;
            if (uri == null || uri.Length == 0) {
                uri = "/";
            }
            data.Append(UrlEncode(uri, true));
            data.Append("\n");
         
            data.Append(parameters);
            return data.ToString();
        }

        private String UrlEncode(String data, bool path) {
            StringBuilder encoded = new StringBuilder();
            String unreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~" + (path ? "/" : "");

            foreach (char symbol in System.Text.Encoding.UTF8.GetBytes(data)) {
                if (unreservedChars.IndexOf(symbol) != -1) {
                    encoded.Append(symbol);
                }
                else {
                    encoded.Append("%" + String.Format("{0:X2}", (int)symbol));
                }
            } return encoded.ToString();

        }

        //public void Cancel() {
        //    if (_http != null) {
        //        _http.Close();
        //        _http = null;
        //    }
        //}

        //private Exception doError(Http h) {
        //    string html = h.Html;
        //    string str = "返回码 " + h.StatusCode.ToString();
        //    if (html != null && html.StartsWith("<?xml", StringComparison.OrdinalIgnoreCase)) {
        //        XmlTextReader xmlTextReader = null;
        //        try {
        //            xmlTextReader = Xml.CreateReader(h.Html);
        //            xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
        //            string a = "";
        //            string text;
        //            while (true) {
        //                if (!xmlTextReader.Read()) {
        //                    return new WebException(str + " : \r\n" + h.Description);
        //                }
        //                XmlNodeType nodeType = xmlTextReader.NodeType;
        //                XmlNodeType xmlNodeType = nodeType;
        //                if (xmlNodeType != XmlNodeType.Element) {
        //                    if ((uint)(xmlNodeType - 3) <= 1u) {
        //                        text = xmlTextReader.Value;
        //                        if (text.StartsWith("Access denied")) {
        //                            text = "帐号被封或者没开通！";
        //                        }
        //                        else if (text.StartsWith("Request is throttled")) {
        //                            text = "提交频率过高，被亚马逊限制，请5-10分钟后再试。";
        //                        }
        //                        else if (text.StartsWith("Invalid seller id:")) {
        //                            text = "卖家编号错误:" + text.Substring("Invalid seller id:".Length + 1);
        //                        }
        //                        else if (text.StartsWith("Feed rejected")) {
        //                            text = "帐号被封，提交被拒绝！";
        //                        }
        //                        else if (text.StartsWith("The AWS Access Key Id you provided does not exist in our records")) {
        //                            text = "亚马逊密钥不对，请检查授权！";
        //                        }
        //                        else if (text.StartsWith("The request signature we calculated does not match the signature you provided")) {
        //                            text = "亚马逊密钥不对，请检查授权！";
        //                        }
        //                        else if (text.StartsWith("The seller does not have an eligible Amazon account to call Amazon MWS")) {
        //                            text = "帐号还没开通API，请联系亚马逊！";
        //                        }
        //                        else if (text.StartsWith("We cannot process this request because your account is still being setup or there is an issue with the account")) {
        //                            text = "您的帐户还在设置中，或者有问题。";
        //                        }
        //                        else if (text.StartsWith("Feed Submission Result is not ready for Feed")) {
        //                            text = "提交的数据还没处理完毕，请稍后再试！";
        //                        }
        //                        if (a == "Message") {
        //                            break;
        //                        }
        //                    }
        //                }
        //                else {
        //                    a = xmlTextReader.Name;
        //                }
        //            }
        //            return new WebException(str + " : \r\n" + text);
        //        }
        //        finally {
        //            if (xmlTextReader != null) {
        //                xmlTextReader.Close();
        //            }
        //        }
        //    }
        //    Html html2 = new Html();
        //    html2.Parse(html);
        //    return new WebException(str + " : \r\n" + html2.Text);
        //}

        //public void GetStatus() {
        //    _dir = "/Orders/2013-09-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetServiceStatus";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["Version"] = "2013-09-01";
        //    Http h = CreateHttp(sortedList);
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            EDialog.Show(error);
        //        }
        //        else {
        //            StringBuilder stringBuilder = new StringBuilder();
        //            XmlTextReader xmlTextReader = null;
        //            try {
        //                xmlTextReader = Xml.CreateReader(h.Html);
        //                xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
        //                string a = "";
        //                while (xmlTextReader.Read()) {
        //                    XmlNodeType nodeType = xmlTextReader.NodeType;
        //                    XmlNodeType xmlNodeType = nodeType;
        //                    if (xmlNodeType != XmlNodeType.Element) {
        //                        if ((uint)(xmlNodeType - 3) <= 1u) {
        //                            string value = null;
        //                            if (a == "Status") {
        //                                value = "状态：" + xmlTextReader.Value;
        //                            }
        //                            else if (a == "Message") {
        //                                value = xmlTextReader.Value;
        //                            }
        //                            else if (a == "Timestamp") {
        //                                DateTime utcNow = DateTime.UtcNow;
        //                                DateTime d = Valid.ToDate(xmlTextReader.Value);
        //                                value = "时间：" + Valid.ToString(d, Date.全部显示) + "  UTC";
        //                            }
        //                            if (!string.IsNullOrEmpty(value)) {
        //                                if (stringBuilder.Length > 0) {
        //                                    stringBuilder.Append("\r\n");
        //                                }
        //                                stringBuilder.Append(value);
        //                            }
        //                        }
        //                    }
        //                    else {
        //                        a = xmlTextReader.Name;
        //                    }
        //                }
        //            }
        //            finally {
        //                if (xmlTextReader != null) {
        //                    xmlTextReader.Close();
        //                }
        //            }
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public Record GetResult(long feedid, Action<int> prog) {
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetFeedSubmissionResult";
        //    sortedList["Merchant"] = _merchant;
        //    sortedList["FeedSubmissionId"] = feedid.ToString();
        //    sortedList["Version"] = "2009-01-01";
        //    PType = Feed.ProcessingReport;
        //    Append("<Message><MessageID>1</MessageID><ProcessingReport><DocumentTransactionID>" + feedid + "</DocumentTransactionID></ProcessingReport></Message>");
        //    Http h = CreateHttp(sortedList);
        //    if (prog != null) {
        //        h.ProgressDownload = delegate(int readed, int total) {
        //            int num = (h.ContentLength == 0) ? total : (total * 100 / h.ContentLength);
        //            if (num > 100) {
        //                num = 100;
        //            }
        //            prog(num);
        //        };
        //    }
        //    string text = Post(h, "");
        //    Record record = new Record();
        //    using (XmlTextReader xmlTextReader = Xml.CreateReader(text)) {
        //        xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
        //        string text2 = "";
        //        while (xmlTextReader.Read()) {
        //            XmlNodeType nodeType = xmlTextReader.NodeType;
        //            XmlNodeType xmlNodeType = nodeType;
        //            if (xmlNodeType != XmlNodeType.Element) {
        //                if ((uint)(xmlNodeType - 3) <= 1u) {
        //                    string text3 = text2;
        //                    switch (text3) {
        //                        case "SKU":
        //                            record.Columns.Add("sku").Set(xmlTextReader.Value.Trim());
        //                            break;
        //                        case "AmazonOrderID":
        //                            record.Columns.Add("sku").Set(xmlTextReader.Value.Trim());
        //                            break;
        //                        case "ResultDescription":
        //                            record.Columns.Add("desc").Set(xmlTextReader.Value);
        //                            break;
        //                        case "ResultMessageCode":
        //                            record.Columns.AddInt("code").Set(Valid.ToInt(xmlTextReader.Value));
        //                            break;
        //                        case "ResultCode":
        //                            record.Columns.AddBool("iswarn").Set(xmlTextReader.Value.IndexOf("Warning", StringComparison.OrdinalIgnoreCase) > -1);
        //                            break;
        //                    }
        //                }
        //            }
        //            else {
        //                text2 = xmlTextReader.Name;
        //                if (text2 == "Result") {
        //                    record.AddRow();
        //                }
        //            }
        //        }
        //    }
        //    return record;
        //}

        public long Submit() {
            return Submit(XML);
        }

        public long Submit(string xml) {
         
            return -1;        
        }

        public string GetFeedResult(string feedId) {
            try {
                //AWSAccessKeyId=AKIAJM7VUNOFUDTTNCAQ&Action=GetFeedSubmissionResult&FeedSubmissionId=50453018308&MWSAuthToken=amzn.mws.9eb6af40-9ab2-3b9c-3ff3-e56246a2ddd4&Merchant=A3K33KPXVW7SN7&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2020-02-16T07%3A29%3A46Z&Version=2009-01-01
                SortedList<string, string> sortedList = Prepare();
                sortedList["Action"] = "GetFeedSubmissionResult";
                sortedList["Merchant"] = _merchant;
                sortedList["Version"] = "2009-01-01";
                sortedList["FeedSubmissionId"] = feedId;
                
                return PostToAmazon(sortedList);
            }
            catch (Exception ex) {

            }
            return "";
        }

        public static long GetFeedid(string html) {
            XmlTextReader xmlTextReader = new XmlTextReader(html, XmlNodeType.Element, null);
            try {
                xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
                string name = "";
                while (true) {
                    if (!xmlTextReader.Read()) {
                        return 1L;
                    }
                    XmlNodeType nodeType = xmlTextReader.NodeType;
                    XmlNodeType xmlNodeType = nodeType;
                    if (xmlNodeType != XmlNodeType.Element) {
                        if ((uint)(xmlNodeType - 3) <= 1u && name == "FeedSubmissionId") {
                            break;
                        }
                    }
                    else {
                        name = xmlTextReader.Name;
                    }
                }

                return xmlTextReader.Value.ToLong();
            }
            finally {
                if (xmlTextReader != null) {
                    xmlTextReader.Close();
                }
            }
        }

        //public string ListOrders(DateTime LastUpdatedAfter, Action<int> prog) {
        //    _dir = "/Orders/2013-09-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId.Id.1"] = _am.PlaceId;
        //    sortedList["OrderStatus.Status.1"] = "Unshipped";
        //    sortedList["OrderStatus.Status.2"] = "PartiallyShipped";
        //    sortedList["OrderStatus.Status.3"] = "Shipped";
        //    sortedList["Version"] = "2013-09-01";
        //    if (NextToken.Length == 0) {
        //        sortedList["Action"] = "ListOrders";
        //        sortedList["LastUpdatedAfter"] = Valid.ToString(LastUpdatedAfter, Date.亚马逊);
        //    }
        //    else {
        //        sortedList["Action"] = "ListOrdersByNextToken";
        //        sortedList["NextToken"] = NextToken;
        //    }
        //    NextToken = "";
        //    _http = CreateHttp(sortedList);
        //    if (prog != null) {
        //        _http.ProgressDownload = delegate(int readed, int total) {
        //            int num = (_http.ContentLength == 0) ? total : (total * 100 / _http.ContentLength);
        //            if (num > 100) {
        //                num = 100;
        //            }
        //            prog(num);
        //        };
        //    }
        //    string text = Post(_http, "");
        //    using (XmlTextReader xmlTextReader = Xml.CreateReader(text)) {
        //        string a = "";
        //        while (xmlTextReader.Read()) {
        //            switch (xmlTextReader.NodeType) {
        //                case XmlNodeType.Text:
        //                    if (a == "NextToken") {
        //                        NextToken = xmlTextReader.Value;
        //                        return text;
        //                    }
        //                    break;
        //                case XmlNodeType.Element:
        //                    a = xmlTextReader.Name;
        //                    break;
        //            }
        //        }
        //    }
        //    return text;
        //}

        //public string OrderItems(string amazonid) {
        //    _dir = "/Orders/2013-09-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["Version"] = "2013-09-01";
        //    if (NextToken.Length == 0) {
        //        sortedList["Action"] = "ListOrderItems";
        //        sortedList["AmazonOrderId"] = amazonid;
        //    }
        //    else {
        //        sortedList["Action"] = "ListOrderItemsByNextToken";
        //        sortedList["NextToken"] = NextToken;
        //    }
        //    NextToken = "";
        //    Http h = CreateHttp(sortedList);
        //    string text = Post(h, "");
        //    using (XmlTextReader xmlTextReader = Xml.CreateReader(text)) {
        //        string a = "";
        //        while (xmlTextReader.Read()) {
        //            switch (xmlTextReader.NodeType) {
        //                case XmlNodeType.Text:
        //                    if (a == "NextToken") {
        //                        NextToken = xmlTextReader.Value;
        //                        return text;
        //                    }
        //                    break;
        //                case XmlNodeType.Element:
        //                    a = xmlTextReader.Name;
        //                    break;
        //            }
        //        }
        //    }
        //    return text;
        //}

        //public void RequestReport(Action<long> finish, Action<Exception> failed) {
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "RequestReport";
        //    sortedList["ReportType"] = "_GET_MERCHANT_LISTINGS_DATA_";
        //    sortedList["StartDate"] = Valid.ToString(new DateTime(2000, 1, 1), Date.亚马逊);
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId.Id.1"] = _am.PlaceId;
        //    sortedList["Version"] = "2009-01-01";
        //    Http h = CreateHttp(sortedList);
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            if (failed != null) {
        //                failed(error);
        //            }
        //            else {
        //                EDialog.Show(error);
        //            }
        //        }
        //        else {
        //            using (XmlTextReader xmlTextReader = Xml.CreateReader(h.Html)) {
        //                xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
        //                string a = "";
        //                while (true) {
        //                    if (!xmlTextReader.Read()) {
        //                        return;
        //                    }
        //                    XmlNodeType nodeType = xmlTextReader.NodeType;
        //                    XmlNodeType xmlNodeType = nodeType;
        //                    if (xmlNodeType != XmlNodeType.Element) {
        //                        if ((uint)(xmlNodeType - 3) <= 1u && a == "ReportRequestId") {
        //                            break;
        //                        }
        //                    }
        //                    else {
        //                        a = xmlTextReader.Name;
        //                    }
        //                }
        //                if (finish != null) {
        //                    finish(Valid.ToLong(xmlTextReader.Value));
        //                }
        //            }
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public void GetReportRequestList(long requestid, Action<long> finish, Action<Exception> failed) {
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetReportRequestList";
        //    sortedList["ReportType"] = "_GET_MERCHANT_LISTINGS_DATA_";
        //    sortedList["ReportRequestIdList.Id.1"] = requestid.ToString();
        //    sortedList["ReportProcessingStatusList.Status.1"] = "_DONE_";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId.Id.1"] = _am.PlaceId;
        //    sortedList["Version"] = "2009-01-01";
        //    Http h = CreateHttp(sortedList);
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            if (failed != null) {
        //                failed(error);
        //            }
        //            else {
        //                EDialog.Show(error);
        //            }
        //        }
        //        else {
        //            using (XmlTextReader xmlTextReader = Xml.CreateReader(h.Html)) {
        //                xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
        //                string a = "";
        //                while (xmlTextReader.Read()) {
        //                    XmlNodeType nodeType = xmlTextReader.NodeType;
        //                    XmlNodeType xmlNodeType = nodeType;
        //                    if (xmlNodeType != XmlNodeType.Element) {
        //                        if ((uint)(xmlNodeType - 3) <= 1u && a == "GeneratedReportId") {
        //                            if (finish != null) {
        //                                finish(Valid.ToLong(xmlTextReader.Value));
        //                            }
        //                            return;
        //                        }
        //                    }
        //                    else {
        //                        a = xmlTextReader.Name;
        //                    }
        //                }
        //            }
        //            Action<long> action = finish;
        //            if (action != null) {
        //                action(0L);
        //            }
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public void GetReport(long reportid, string path, EProgress prog, Action<string> finish, Action<Exception> failed) {
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetReport";
        //    sortedList["ReportId"] = reportid.ToString();
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId.Id.1"] = _am.PlaceId;
        //    sortedList["Version"] = "2009-01-01";
        //    Http h = CreateHttp(sortedList);
        //    h.File = path;
        //    h.ProgressDownload = delegate(int readed, int total) {
        //        int num = (h.ContentLength == 0) ? total : (total * 100 / h.ContentLength);
        //        if (num > 100) {
        //            num = 100;
        //        }
        //        prog.SetTextValue("正在下载产品报告 " + num + " % ...", num);
        //    };
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            if (failed != null) {
        //                failed(error);
        //            }
        //            else {
        //                EDialog.Show(error);
        //            }
        //        }
        //        else if (finish != null) {
        //            finish(path);
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public string MatchingProduct(string[] asins) {
        //    _dir = "/Products/2011-10-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetMatchingProduct";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId"] = _am.PlaceId;
        //    sortedList["Version"] = "2011-10-01";
        //    int num = Math.Min(10, asins.Length);
        //    for (int i = 0; i < num; i++) {
        //        sortedList["ASINList.ASIN." + (i + 1)] = asins[i];
        //    }
        //    return Post(sortedList);
        //}

        //public string MatchingProductForId(string type, string[] skus) {
        //    _dir = "/Products/2011-10-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetMatchingProductForId";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId"] = _am.PlaceId;
        //    sortedList["IdType"] = ((type == "SKU") ? "SellerSKU" : type);
        //    sortedList["Version"] = "2011-10-01";
        //    int num = Math.Min(5, skus.Length);
        //    for (int i = 0; i < num; i++) {
        //        sortedList["IdList.Id." + (i + 1)] = skus[i];
        //    }
        //    return Post(sortedList);
        //}

        //public void GetCompetitivePricingForSKU(string[] skus, Action<string> finish, Action<Exception> failed = null) {
        //    _dir = "/Products/2011-10-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetCompetitivePricingForSKU";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId"] = _am.PlaceId;
        //    sortedList["Version"] = "2011-10-01";
        //    int num = Math.Min(20, skus.Length);
        //    for (int i = 0; i < num; i++) {
        //        sortedList["SellerSKUList.SellerSKU." + (i + 1)] = skus[i];
        //    }
        //    Http h = CreateHttp(sortedList);
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            if (failed != null) {
        //                failed(error);
        //            }
        //            else {
        //                EDialog.Show(error);
        //            }
        //        }
        //        else {
        //            Action<string> action = finish;
        //            if (action != null) {
        //                action(h.Html);
        //            }
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public void GetCompetitivePricingForASIN(string[] asins, Action<string> finish, Action<Exception> failed = null) {
        //    _dir = "/Products/2011-10-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetCompetitivePricingForASIN";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId"] = _am.PlaceId;
        //    sortedList["Version"] = "2011-10-01";
        //    int num = Math.Min(20, asins.Length);
        //    for (int i = 0; i < num; i++) {
        //        sortedList["ASINList.ASIN." + (i + 1)] = asins[i];
        //    }
        //    Http h = CreateHttp(sortedList);
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            if (failed != null) {
        //                failed(error);
        //            }
        //            else {
        //                EDialog.Show(error);
        //            }
        //        }
        //        else {
        //            Action<string> action = finish;
        //            if (action != null) {
        //                action(h.Html);
        //            }
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public void GetLowestOfferListingsForSKU(string[] skus, Action<string> finish, Action<Exception> failed = null) {
        //    _dir = "/Products/2011-10-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetLowestOfferListingsForSKU";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId"] = _am.PlaceId;
        //    sortedList["Version"] = "2011-10-01";
        //    int num = Math.Min(20, skus.Length);
        //    for (int i = 0; i < num; i++) {
        //        sortedList["SellerSKUList.SellerSKU." + (i + 1)] = skus[i];
        //    }
        //    Http h = CreateHttp(sortedList);
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            if (failed != null) {
        //                failed(error);
        //            }
        //            else {
        //                EDialog.Show(error);
        //            }
        //        }
        //        else {
        //            Action<string> action = finish;
        //            if (action != null) {
        //                action(h.Html);
        //            }
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public void GetLowestOfferListingsForASIN(string[] asins, Action<string> finish, Action<Exception> failed = null) {
        //    _dir = "/Products/2011-10-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetLowestOfferListingsForASIN";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId"] = _am.PlaceId;
        //    sortedList["Version"] = "2011-10-01";
        //    int num = Math.Min(20, asins.Length);
        //    for (int i = 0; i < num; i++) {
        //        sortedList["ASINList.ASIN." + (i + 1)] = asins[i];
        //    }
        //    Http h = CreateHttp(sortedList);
        //    h.Completed = delegate {
        //        Exception error = h.Error;
        //        if (error == null && h.StatusCode != 200) {
        //            error = doError(h);
        //            if (failed != null) {
        //                failed(error);
        //            }
        //            else {
        //                EDialog.Show(error);
        //            }
        //        }
        //        else {
        //            Action<string> action = finish;
        //            if (action != null) {
        //                action(h.Html);
        //            }
        //        }
        //    };
        //    PostAsync(h);
        //}

        //public NameValueCollection GetProductAsins(string[] skus) {
        //    _dir = "/Products/2011-10-01";
        //    SortedList<string, string> sortedList = Prepare();
        //    sortedList["Action"] = "GetMyPriceForSKU";
        //    sortedList["SellerId"] = _merchant;
        //    sortedList["MarketplaceId"] = _am.PlaceId;
        //    sortedList["Version"] = "2011-10-01";
        //    string str = "";
        //    int num = Math.Min(10, skus.Length);
        //    for (int i = 0; i < num; i++) {
        //        sortedList["SellerSKUList.SellerSKU." + (i + 1)] = skus[i];
        //        if (i < 2) {
        //            str = str + ((i > 0) ? "," : "") + skus[i];
        //        }
        //    }
        //    string text = Post(sortedList);
        //    NameValueCollection nameValueCollection = new NameValueCollection();
        //    using (XmlTextReader xmlTextReader = Xml.CreateReader(text)) {
        //        xmlTextReader.WhitespaceHandling = WhitespaceHandling.None;
        //        string a = "";
        //        string text2 = "";
        //        string text3 = "";
        //        while (xmlTextReader.Read()) {
        //            switch (xmlTextReader.NodeType) {
        //                case XmlNodeType.EndElement:
        //                    if (xmlTextReader.Name == "Identifiers") {
        //                        if (text2.Length > 0 && text3.Length > 0) {
        //                            nameValueCollection[text3] = text2;
        //                        }
        //                        text2 = "";
        //                        text3 = "";
        //                    }
        //                    break;
        //                case XmlNodeType.Text:
        //                    if (a == "ASIN") {
        //                        text2 = xmlTextReader.Value;
        //                    }
        //                    else if (a == "SellerSKU") {
        //                        text3 = xmlTextReader.Value;
        //                    }
        //                    break;
        //                case XmlNodeType.Element:
        //                    a = xmlTextReader.Name;
        //                    break;
        //            }
        //        }
        //    }
        //    return nameValueCollection;
        //}


        public AmazonMeta AmazonMeta { get; set; }
        public IAmazonService AmazonSerivice { get; set; }

        /// <summary>
        /// 更新FeedId
        /// </summary>
        /// <param name="feedId"></param>
        /// <returns></returns>
        public bool UpdateModel(long feedId) {
            if (this.PType == Feed.Product) {
                AmazonMeta.UpdateOn = DateTime.Now;
                if (feedId > 1) {
                    AmazonMeta.FeedId = feedId.ToString();
                    AmazonMeta.UpLoadStatus = 1;                  
                    return AmazonSerivice.UpdateModel(AmazonMeta);
                }
                else {
                    AmazonMeta.UpLoadStatus = -1;
                    return AmazonSerivice.UpdateModel(AmazonMeta);
                }          
            }
            else {
                return false;
            }           
        }
    }
}
